# -*- coding: utf-8 -*-
# @Project : TCP-client-side
# @File    : TcpConnect.py
# @Author  : 朱宽
# @Time    : 2021/5/22 17:20
# @Software: Win10 / Python3 / Pycharm
from config.globalConfig import tcp_host,tcp_port
import socket
import sys
import re

class Tcp():
    def __init__(self):
        self.host=tcp_host
        self.port=tcp_port
        self.address = (self.host,self.port)  # 定义要连接的地址
        self.buff_size = 4096  # 定义每次传输的字节长度

    def connect(self):
        '''
        连接服务器
        :return:
        '''
        try:
            client = socket.socket(socket.AF_INET,
                                   socket.SOCK_STREAM)  # socket，socket.AF_INET面向网络的。socket.SOCK_STREAM是TCP的链接的套接字
            client.settimeout(20)#设置连接，超时等待20秒
            client.connect(self.address)  # 链接服务器
            #print('\n')
            #print('连接成功！' + '\t服务器地址：' + self.host + '\t服务器端口：' + str(self.port))
            return client

        except socket.error as error_msg:  # 捕获服务器拒绝链接的错误，并输出。
            print(error_msg)
            sys.exit(1)

    def receive(self,client,eol,timeout=5):
        '''
        接收数据
        :param client: TCP连接
        :param eol: 终止位
        :return:
        '''
        try:
            result=''

            while(True): # 当前时间 与 开始时间 的差小于等于5秒时，才运行；否则跳出while循环
                client.settimeout(timeout)#设置接收时间 超时等待5秒
                res=client.recv(self.buff_size) # res是bytes型数据

                # 使用正则表达式匹配最后几位是否 eol，母串是res.hex()--->bytes转换为16进制数的字符串
                flag_stop=re.search(eol.lower()+"$",res.hex())

                if flag_stop!=None:#如果匹配到了，则跳出循环
                    result=result+res.hex()
                    break
                else:
                    result=result+res.hex()

            if result=='':
                result=None
                return result
            else:
                return result #回复的结果是16进制数的字符串

        except Exception as e:
            return e
    def send(self,client,data):
        '''
        发送数据
        :param client:
        :param data:
        :return:
        '''
        send_data = bytearray.fromhex(data)#16进制字符串转换为字节数组
        client.sendall(send_data)

    def close(self, client):
        '''
        关闭连接
        :param client:
        :return:
        '''
        client.close()
        #print('关闭连接！')


if __name__ == "__main__":
    b = '78781101000011112222333370003201000106d60d0a'

    test = Tcp()
    my_client = test.my_connect()
    send_data= bytearray.fromhex(b)
    #send_data=bytes.fromhex(b)

    my_client.sendall(send_data)

    data1 = test.my_receive(client=my_client,eol='0d0a')

    print('\n[发送] 16进制字符串：', b)
    print('[发送] 16进制字符串转为字节数组--类型：', type(send_data))
    print('[发送] 内容为：', send_data)

    print('\n[回复] 接收到的数据--类型：',type(data1))
    #print('[回复] 接收到的数据--长度：',len(data1))
    print('[回复] 内容为：',str(data1),type(str(data1)))


    if data1=='787805010001d9dc0d0a':
        print('\n服务端应答正确，通信成功！')
    else:
        print('\n服务端应答错误，通信失败！')

    test.my_close(client=my_client)
